package main

import (
	"fmt"
	"time"
)

/*
Go语言中使用 goroutine 非常简单，只需要在调用函数前面加上go 关键字，就可以为一个函数创建一个goroutine
一个goroutine必定对应一个函数，可以创建多个goroutine去执行相同的函数。
1.启动单个goroutine
启动goroutine 的方式非常简单，只需要再调用的函数（普通函数和匿名函数）前面加上go关键字。
*/

func hello() {
	fmt.Println("Hello Goroutine!")
}

//func main() {
//	go hello()
//	fmt.Println("main goroutine done!")
//}

/*
这时候我们可能会发现有时候打印只会打印出：main goroutine done! 这是为什么？
这是因为，在程序启动时，Go 程序就会为 main() 函数创建一个默认的 goroutine。

当 main() 函数返回的时候该 goroutine 就结束了，所有在 main() 函数中启动的 goroutine 会一同结束，main 函数所在的 goroutine 就像是权利的游戏中的夜王，其他的 goroutine 都是异鬼，夜王一死它转化的那些异鬼也就全部GG了。

所以我们要想办法让 main 函数等一等 hello 函数，最简单粗暴的方式就是 time.Sleep 了：
*/
func main() {
	go hello()
	fmt.Println("main goroutine done")
	time.Sleep(time.Second)
}

/**
执行上面的代码你会发现，这一次先打印 main goroutine done!，然后紧接着打印 Hello Goroutine!。

首先为什么会先打印 main goroutine done! ？，是因为我们在创建新的 goroutine 的时候需要花费一些时间，
而此时main 函数所在的 goroutine 不会等着，会继续执行，所以先打印 main goroutine done!，一段时间后，
hello() 函数的 goroutine 创建好了，执行打印 Hello Goroutine!。

*/
